ulimit コマンド(Cシェル系はlimitコマンド)を使用することで、ユーザーが使用できるプロセスなどのリソースを制限することができます。ユーザーの故意による誤操作やプログラムのバグ、悪意のあるユーザーによるリソースの消費などを回避することができるようになります。まず、現在のメモリ制限を確認するには、-a
オプションを指定して実行します。unlimited となっている箇所は文字通り、「無制限」という意味になります。
# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 2047 virtual memory (kbytes, -v) unlimited |
メモリ制限を行なうには、-m <サイズ(KB単位)> を指定します。以下の例では一人当たりのメモリ容量の制限を64MBに設定した例です。
# ulimit -m 65536 # ulimit -a | grep max.m max memory size (kbytes, -m) 65536 |
元に戻すには、以下のように実行します。
# ulimit -m unlimited |
nmapを使用して現在立ち上がっているサービスポートを確認し、その中で不必要と思われるサービスは停止させておきます。 まず、OpenSSHサーバーを立ち上げているならば、telnet、rlogin、rcp、rsh、ftp
に関してはOpenSSH で代用ができるので停止させてしまいましょう。111番ポートのsunrpc は、NFSの基礎として使用されており、外部ネットワークに対して開かれていると非常に危険で侵入される可能性も高くなるので停止させておきましょう。sunrpcを停止させるには、portmap
を停止させます(chkconfig --level 345 portmap off )。
# nmap localhost |
Starting nmap V. 3.00 ( www.insecure.org/nmap/ ) Interesting ports on ns1.click-rescue.com (127.0.0.1): (The 1589 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 110/tcp open pop-3 111/tcp open sunrpc 953/tcp open rndc 3128/tcp open squid-http 3306/tcp open mysql 5432/tcp open postgres 8080/tcp open http-proxy |
まず、サービスを起動しておいた方が望ましいサービスについて以下に列挙します。
network | TCP/IPネットワーク |
xinetd | スーパーサーバー |
random | 乱数発生。SSLをサポートする場合に必要となる |
syslog | システムのログを管理する |
crond | 定期的なジョブを実行する |
anacron | cronの機能をサポートする |
keytable | キーマップをロードする |
kudzu | システム起動時に新しいハードウェアを検出する |
iptables | ネットワークセキュリティツール |
rawdevices | 「Raw」デバイスのサポート |
基本的には必要がないと思われるサービスを列挙します。各自の環境によって必要と思われるものは随時、起動させるようにしてください。
netfs | /etc/fstabに記述してあるNFS、SMB、NCPなどのネットワークファイルシステムをマウントする # chkconfig --level 345 netfs off |
apmd | 電源管理を行うAPMデーモン # chkconfig --level 2345 apmd off |
atd | atコマンドにより、時間を指定してプログラムを実行する # chkconfig --level 345 atd off |
gpm | コンソールでのマウスエミュレータ # chkconfig --level 2345 gpm off |
autofs | 自動でマウントするデーモン # chkconfig --level 2345 autofs off |
irda | IrDA赤外線通信デバイスの制御サービス(デフォルトoff) |
isdn | ISDN用接続スクリプトサービス。ISDNを使用しているのでなければ停止する。 # chkconfig --level 2345 isdn off |
portmap | リモートプロシージャコールのポートを管理(NFSサーバーで利用) # chkconfig --level 345 portmap off |
nfs | ファイル共有を行うNFS(Network File System)サーバー(デフォルトoff) |
nfslock | NFSでファイルのロックを行う # chkconfig --level 345 nfslock off |
sendmail | 電子メールサーバー。他メールサーバーを使用しているならば停止させる。 # chkconfig --level 2345 sendmail off |
rhnsd | RedHatに接続し、アップデートがないか定期的にチェックする # chkconfig --level 345 rhnsd off |
xfs | XFree86用のフォントサーバー。X-Windowを使用していなければ不要。 # chkconfig --level 2345 xfs off |
canna | カナ漢字変換 # chkconfig --level 2345 canna off |
FreeWnn | カナ漢字変換 # chkconfig --level 2345 FreeWnn off |
lpd |
ラインプリンタデーモン。プリントサーバーでないのなら不必要。 |
xinetd を介して起動されるサービスで不要と思われるものは停止しておきましょう。特にtelnet
は外部に対してサービスを稼動させるのは厳禁です。
chargen-udp | デバックなどで利用するキャラクタージェネレーター[ UDP ](デフォルトoff) |
rsync | ファイルの同期を行う(デフォルトoff) |
chargen | デバックなどで利用するキャラクタージェネレーター[ TCP ](デフォルトoff) |
daytime-udp | 日時を通知する[ UDP ](デフォルトoff) |
daytime | 日時を通知する[ TCP ](デフォルトoff) |
echo-udp | pingコマンドへの応答[ UDP ](デフォルトoff) |
echo | pingコマンドへの応答[ TCP ](デフォルトoff) |
time-udp | timeプロトコル[ UDP ](デフォルトoff) |
time | timeプロトコル[ TCP ](デフォルトoff) |
dbskkd-cdb | RedHatに接続し、アップデートがないか定期的にチェックする |
sgi_fam | ファイルやディレクトリの変更を知らせるサービス。使用していないのであれば停止させておく。デフォルトではon # chkconfig sgi_fam off |
telnet | Telnetサービス。停止した方が望ましい。(デフォルトoff) |
netstat コマンドを使って待機しているポートを確認しておくことで不必要なサービスが稼動していないか調べることができます。もし、不必要なサービスが稼動していれば必要に応じて停止させておきましょう。
# netstat -an | more |
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 172.16.50.2:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN |
w コマンドは、ユーザー名とその利用状況を表示します。
JCPUはユーザーが使用しているttyから実行されている全プロセスが使った時間のこと。
PCPUはwhat項目で示されているカレント・プロセスが使っている時間のこと。
w [オプション] [ユーザー] |
|
-h | ヘッダーを表示しない |
-l | すべてを表示する |
-s | ログイン時刻,JCPU,PCPUを表示しない |
-u | 現在のプロセスとCPU時間を計算しているときに,ユーザー名の違いを無視する |
-f | FROM (リモートホスト名) 項目を表示しない |
-i | ホスト名の代わりにIPアドレスを表示する。 |
-V | バージョンを表示する |
sudo は一般ユーザに特定のコマンドを実行させるためのものです。一般ユーザ権限では実行できないコマンドを、あるユーザだけには許可したいが、root 権限を与えたくはない場合に使います。また、誰がどういうコマンドを実行したかは /var/log/messages や /var/log/syslog に記録されます。
sudo の設定ファイルは /etc/sudoers ですが、このファイルを直接編集してはいけません。visudo というファイル編集用のコマンドがあるので、それを使います。
sudo はほとんどのLinuxディストリビューションにはデフォルトでインストールされています。以下のコマンドを実行してsudo
がインストールされているかどうかを確認してください。
# rpm -qa | grep
sudo sudo-1.6.7p5-2 |
インストールされていなければyum もしくは、apt-get を利用してインストールしておきましょう。
# yum install sudo or # apt-get install sudo |
sudo コマンドは、なにも設定していない状態では一般ユーザはデフォルトで使用できないようになっています。試しに root しか閲覧することのできない/var/log/messageをsudo コマンドを実行して見ようとするとパスワードの入力を求められ、どのようなパスワードを入力してもコマンドは以下のように失敗してしまいます。このログインの失敗は、/var/log/message に書き込まれます。
$ sudo tail /var/log/messages Password: Sorry, try again. sakura is not in the sudoers file. This incident will be reported. |
それでは実際に一般ユーザに対してsudo コマンドが使用できるように設定していきます。設定ファイルは、/etc/sudoers
になりますが、このファイルを絶対に vi で編集しないようにしてください。このファイルの設定ミスなどをしてしまうと思わぬトラブルを引き起こしかねないので、sudoersファイルのロックや構文チェックを行ってくれる visudo というコマンドが用意されています。visudo コマンドを実行すると、viが立ち上がり編集できるようになります。以下のように記述すると一般ユーザに対して全てのroot 権限が与えられます。具体的には、「ユーザーsakuraは、すべての接続元(ALL)から、すべてのユー ザー権限(ALL)で、すべてのコマンド(ALL)を実行できる」という意味になります。
# visudo |
%sakura ALL=(ALL) ALL <---sakura に全てのroot 権限を与える |
ユーザには、sudo権限を与えたいユーザー名を記述します。今回の例ではsakuraにする。
ホストには使用したいホストを書きます。一般的にはALLと書きます。
権限には「誰の権限でコマンドを実行したいか」を書きますが、ここも一般的にはALLにします。
コマンドにはsudoで扱えるコマンドを絶対パスで指定します。複数指定する場合は,(カンマ)で区切ります。
※visudo の構文チェック
編集し終わると、visudoが勝手に文法チェックを行ない、エラーが出た場合はエラーが出た行番号を表示し、どうするか聞いてきます。
e を押せば再編集ができ、x を押せば編集せずに終了します。q を押せば編集を保存して終了するため、q を押すのは本当にエラーが無くなったときにします。
構文ミスがあると以下のように知らせてくれます。「e」をタイプすれば再編集することが出来ます。
Warning: undeclared Host_Alias `LOCAL' referenced near line 24 >>> sudoers file: syntax error, line 23 <<< What now? Options are: (e)dit sudoers file again e(x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!) |
編集し終えたら、一般ユーザで再ログインしてからもう一度/var/log/message を見てみましょう。これでファイルが正常に閲覧できるようになります。なお、最初にsudo
を実行した時に限り、パスワードを聞かれますが一定の時間内(デフォルト:5分以内)であれば次のコマンド実行時からはパスワードを聞かれなくなります。この時に入力するパスワードは一般ユーザのパスワードであるため、いくらSSHを使っているとはいえ、ネットワーク上にroot
のパスワードが流れなくなるという点では、セキュリティの強化が図れます。
$ sudo tail /var/log/messages Password: 現在ログインしているユーザのパスワードを入力 |
次にHost_Alias を設けてローカルネットワーク( 192.168.0.0/24)に存在するsakura
のみに全 root 権限を与えるように設定します。また、「NOPASSWD」を用いることでパスワードなしでsudo
を実行することもできます。「LOCAL」は定義名なので自由な名前を付けられますが、英大文字でなければならない等の一定のルールがありますので注意してください。
# visudo |
# Host alias specification Host_Alias LOCAL = 192.168.0.0/24 <---あるいは、特定のIPアドレスに限定する or Host_Alias LOCAL = 192.168.0.2 <---あるいは、特定のIPアドレスに限定する # User privilege specification %sakura LOCAL=(ALL) NOPASSWD: ALL |
上記でもHost_Alias を使用して実例を見てみましたが、sudoers のエイリアス機能には以下の4種類があります。定義名は、大文字のA-Z、数字、アンダーバー(_)を使用します。そして先頭文字は必ずA~Zで始まる必要がありますので注意してください。
User_Alias | ユーザー名の別名を定義する 例)User_Alias WEBMASTER = koro, hoge, foo |
Runas_Alias | 実行ユーザー名の別名を定義する 例)Runas_Alias OP = root, operator |
Host_Alias | 接続元ホストの別名を定義する 例)Host_Alias LOCAL = 192.168.0.0/24 例)Host_Alias INTERNET = 172.16.0.1, 172.16.0.2 |
Cmnd_Alias | 実行するコマンドの別名を定義する 例)Cmnd_Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, \ /sbin/poweroff, /sbin/reboot, /sbin/fastboot, /sbin/init |
実際にエイリアス機能を使用して特定コマンドだけを使用できるようにすることもできます。以下のsudoers
の例では、ファイル削除のrm コマンドだけをsakuraユーザに与えていることになります。ここで留意しておきたいのは、rmコマンドだけしか使えなくなるというわけではなく、sudoしてから実行できるコマンドがrm
しかなくなるという意味になります。つまり、ユーザsakuraは一般ユーザ権限の範囲内では、cp やmakdir
等のユーザーコマンドは全て使用することができ、プラス、rootでしか削除できないファイルをsudoから実行して削除できる権限(rm
コマンド)を得たということです。
# visudo |
# Cmnd alias specification Cmnd_Alias RM /bin/rm # User privilege specification %sakura ALL=(ALL) RM |
逆に、システムの停止・再起動の権限をsudoから実行できないようにすることもできます。Cmnd_Alias
で設定した定義のSHUTDOWNの前に打ち消しの意味を持つ「!」をつけると、「SHUTDOWNは実行できない」という意味を持ちます。システムの停止や再起動時には、「sudo
su」や「sudo -s」を実行して、root のシェル権限を得てから慎重に行うのがベストでしょう。
# visudo |
# Cmnd Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, \ /sbin/poweroff, /sbin/reboot, /sbin/fastboot, /sbin/init # User privilege specification %sakura ALL=(ALL) ALL, !SHUTDOWN |
-l | 現在の設定状況を表示する |
-s | sudo su と同等の意味になる。root のシェルを実行する |
先ほども触れましたが、sudo 実行後、一定の時間内であればパスワードを再入力することなく続けてコマンドを実行することができます。このキャッシュタイムアウトは、sudoを実行するたびに更新されます。しかし、この一定の時間内(デフォルトでは5分)というのが問題になる場合もきっとあるでしょう。うっかり席を立ってしまい、その5分以内の間に悪質なユーザにシェルをいじられ重要なファイルを盗まれたり、削除されたりしないとも限りません。自宅サーバーで運用している限りはその心配はほとんどなさそうですが、企業レベルの運用となると少し不安が残ります。なので、このタイムアウトをなくして、sudo
を実行するたびにパスワードが聞かれるようにする方法も頭の片隅にいれておきましょう。記述は簡単です。キャッシュタイムアウトを10分に伸ばしたければ値を「10」にします。また、パスワードプロンプトもよりわかりやすいように改良しておきましょう。デフォルトのパスワードプロンプトでは、「Password:」と味気ないものですが、これをログインユーザとホスト名が表示されるように変更しておきます。
# visudo |
Defaults timestamp_timeout = 0 <---パスワードキャッシュの時間(分単位) Defaults passprompt = "%u@%h Password: " <---パスワードプロンプトの変更 |
一般ユーザーで作業をしていてrootの権限で実行したいとき、またrootユーザーでログインしているが、一般ユーザーでの権限を確認したい時など、ログオフ・ログインをいちいちしなくてもユーザーを切り替えることができます。 それが su コマンドです。
● su コマンド構文
su [- ユーザー] |
|
ユーザーを省略するとrootのことになります。
一般ユーザーからrootユーザーに一時的に変更するには、$ su パスワード: <--- rootのパスワードを入力する |
$ su - sakura パスワード: <--- sakuraのパスワードを入力する |
www.it-shikaku.jp
[Top] | |
[講義目次] | |
[1.09:重要なシステムサービス] | |
[1.10:セキュリティ] | |
[1.10.1 セキュリティ管理業務の実施] | |
[1.10.2 ホストのセキュリティ設定] | |
[1.10.3 暗号化によるデータの保護] | |
[1.10.4 クラウドセキュリティの基礎] | |
[1.11:オープンソースの文化] | |
[講義検索] | |
[リンク集] |